home *** CD-ROM | disk | FTP | other *** search
- // INCLUDES
- #include "MovieProc.h"
-
-
- // GLOBALS
- Movie gMovie = NULL;
- CWindowPtr gWindow = NULL;
-
- Rect gMovieRect = {0, 0, 0, 0};
-
- TimeValue gMovieDuration = 0L;
- long gTickCount = 0L;
- long gSampleCount = 0L;
- Rect gTimeDurationRect = { 5, 5, 10 ,110};
- MovieDrawingCompleteUPP gMovieProc = NULL;
-
- // ______________________________________________________________________
- //• MAIN -- Starting point.
- void main(void) {
- EventRecord anEvent;
- OSErr anErr = noErr;
- OSType mediaType = VideoMediaType;
-
- //• Initialize the needed parts.
- InitMacEnvironment(6);
- InitializeQTEnvironment();
- if ( InitializeMovie() != noErr ) ExitToShell(); // we had problems with the movie.
-
- //• Draw basic strings inside the window.
- DrawFpsStats(0L);
- DrawMovieFpsStats();
- DrawUsageInformation();
-
- //• Event loop.
- for(;;) {
- WaitNextEvent(everyEvent, &anEvent, 60, NULL);
-
- if(anEvent.what == mouseDown)
- break;
-
- if(anEvent.what == keyDown) {
- SetGWorld(gWindow, NULL);
- SetMovieGWorld(gMovie, (CGrafPtr)gWindow, NULL);
- GoToBeginningOfMovie(gMovie);
- StartMovie(gMovie);
-
- gTickCount = TickCount();
- gSampleCount = 1L;
- do {
- MoviesTask(gMovie, 0);
- }
- while (IsMovieDone(gMovie) == false);
-
- gTickCount = TickCount() - gTickCount;
- DrawFpsStats(gTickCount);
- QTUDrawVideoFrameAtTime(gMovie, GetMovieTime(gMovie, NULL)); // nudge one last time to make sure last frame is drawn.
- }
- }
- }
-
- // ______________________________________________________________________
- //• InitMacEnvironment -- Initialize the Mac Toolbox.
- void InitMacEnvironment(long nMasters) {
- long i;
-
- MaxApplZone();
-
- for(i = 0; i <nMasters; i++)
- MoreMasters();
-
- InitGraf(&qd.thePort);
- InitFonts();
- InitWindows();
- InitMenus();
- FlushEvents(everyEvent, 0);
- TEInit();
- InitCursor();
- InitDialogs(NULL);
- }
-
-
- // ______________________________________________________________________
- //• InitializeQTEnvironment -- Initialize the QuickTime movie toolbox parts.
- void InitializeQTEnvironment(void) {
- OSErr anErr = noErr;
-
- if( !QTUIsQuickTimeInstalled() ) {
- DebugStr("\pThe QuickTime extension is not present in this system");
- ExitToShell();
- }
-
- if( (QTUGetQTVersion() >> 16 ) < 0x200 ) {
- DebugStr("\pWe need QT 2.0 or higher due to APIs used in this sample, consult the sources (exit).");
- ExitToShell();
- }
-
- #if powerc
- if( !QTUIsQuickTimeCFMInstalled() ) {
- DebugStr("\pThe QuickTime PowerPlug extension is not available (exit)");
- ExitToShell();
- }
- #endif
-
- anErr = EnterMovies(); DebugAssert(anErr == noErr);
- if(anErr != noErr) {
- DebugStr("\pProblems with Entermovies, returning errors (exit)");
- ExitToShell();
- }
- }
-
-
- // ______________________________________________________________________
- //• InitializeMovie -- Initialize needed movie parts for the offscreen handling.
- OSErr InitializeMovie(void) {
- OSErr anErr = noErr;
- Rect windowBounds = { kWindowYStart, kWindowXStart, kWindowHeigth, kWindowLength};
- Track firstVideoTrack = NULL;
- Media firstVideoMedia = NULL;
- short mediaPixelDepth = 0;
- short monitorPixelDepth = 0;
- Rect trackRect = {0, 0, 0, 0};
- CGrafPtr aSavedPort = NULL;
- GDHandle aSavedGDevice = NULL;
- CTabHandle colorTable = NULL;
- long seed = 0L;
-
- //• Create the window we will use.
- gWindow = (CWindowPtr) NewCWindow(NULL, &windowBounds, "\pMovie Proc Test", true, noGrowDocProc,
- NULL, false, 0); DebugAssert(gWindow != NULL);
- SetPort((GrafPtr)gWindow);
- GetGWorld(&aSavedPort, &aSavedGDevice);
-
- //• Get the movie.
- anErr = QTUSimpleGetMovie(&gMovie); DebugAssert(anErr == noErr);
- if(anErr) goto Closure;
-
- //• Adjust the movie box values.
- GetMovieBox(gMovie, &gMovieRect);
- OffsetRect(&gMovieRect, -gMovieRect.left, -gMovieRect.top);
- SetMovieBox(gMovie, &gMovieRect);
- AlignWindow((WindowPtr)gWindow, false, &gMovieRect, NULL);
-
- //• Specify the Movie GWorld.
- SetMovieGWorld(gMovie, (GWorldPtr)gWindow, NULL);
- anErr = GetMoviesError(); DebugAssert(anErr == noErr); if(anErr) goto Closure;
-
- //• Install the movie drawing complete callback.
- gMovieProc = NewMovieDrawingCompleteProc(&MyQTMovieDrawingCompleteProc);
- SetMovieDrawingCompleteProc(gMovie, movieDrawingCallWhenChanged, gMovieProc, 0);
- anErr = GetMoviesError(); DebugAssert(anErr == noErr); if(anErr) goto Closure;
-
- //• Get movie duration.
- gMovieDuration = GetMovieDuration(gMovie);
-
- //• Update the movie so that the first frame is drawn.
- anErr = QTUDrawVideoFrameAtTime(gMovie, 0L); DebugAssert(anErr == noErr);
-
- Closure:
- return anErr;
- }
-
- // ______________________________________________________________________
- //• MyTrackTransferProc -- Callback called when movie toolbox draws to GWorld.
- pascal OSErr MyQTMovieDrawingCompleteProc(Movie /*theMovie*/, long /*refCon*/) {
- OSErr anErr = noErr;
- PixMapHandle offscreenPixMap = NULL;
- CGrafPtr aSavedPort = NULL;
- GDHandle aSavedGDevice = NULL;
- Str255 tempString;
- long percentage = 0L;
- Rect eraseRect = { 12, kDrawTextX - 5, 24, kDrawTextX + 18};
-
- //• Bounce the sample code (needed for later statistics).
- gSampleCount++;
-
- //• Draw progress bar into main screen.
- PenSize(1,1); ForeColor(blackColor); FrameRect(&gTimeDurationRect);
- percentage = 100L * GetMovieTime(gMovie, NULL) / gMovieDuration;
- MoveTo(5,5); ForeColor(yellowColor); PenSize(4,4); LineTo( percentage +5L, 5);
-
- //• Draw percentage numbers.
- EraseRect(&eraseRect);
- MoveTo(kDrawTextX, 20); TextFace(bold); TextSize(9);
- NumToString(percentage, tempString); ForeColor(redColor); DrawString(tempString);
- MoveTo(kDrawTextX + 20, 20); DrawString("\p%"); ForeColor(blackColor);
-
- return anErr;
- }
-
-
- // ______________________________________________________________________
- //• DrawFpsStats -- Provide and draw statistics concerning how many frames were drawn per second.
- void DrawFpsStats(long tickCount){
- Str255 theString;
- Rect eraseArea = {kDrawValuesY-20, kDrawValuesX -20, kDrawValuesY+20, kDrawValuesX+20};
-
- EraseRect(&eraseArea);
-
- //• Display the fps values.
- MoveTo(kDrawTextX, kDrawTextY);
- TextFace(bold); TextSize(9);
- DrawString("\pFrames drawn/second:");
- if(tickCount != 0L) {
- MoveTo(kDrawValuesX, kDrawValuesY);
- NumToString( (60L * gSampleCount/tickCount), theString);
- DrawString(theString);
- }
- }
-
-
- // ______________________________________________________________________
- //• DrawMovieFpsStats -- Get the statistics from the movie concerning frames per second, draw this.
- void DrawMovieFpsStats(void) {
- Str255 theString;
- long nFrames = 0L;
- long nSeconds = 0L;
-
- MoveTo(kDrawTextX, kDrawTextY+40);
- TextFace(bold); TextSize(9);
- DrawString("\pMovie stats, fps: ");
- MoveTo(kDrawValuesX, kDrawValuesY + 40);
-
- nFrames = gMovieDuration / QTUGetDurationOfFirstMovieSample(gMovie, VideoMediaType);
- nSeconds = gMovieDuration / GetMovieTimeScale(gMovie);
- NumToString( (nFrames/nSeconds), theString);
- DrawString(theString);
- }
-
- // ______________________________________________________________________
- //• DrawUsageInformation -- Draw instructions how to use this simple program.
- void DrawUsageInformation(void) {
- TextFace(normal); TextSize(9);
- MoveTo(kDrawTextX, 200); DrawString("\pHit a key to start the movie.");
- MoveTo(kDrawTextX, 220); DrawString("\pClick on the mouse to terminate program.");
- }
-